<?php
/**
 * 程序异常处理类
 *
 * Created	: 2010-10-15
 * Modified : 2010-10-15
 * @author  : 陈立强
 */
class Log {

    /**
     * 写数据到日志文件中
     * @param string $file 相对于LOG路径的相对路径文件名
     * @param string $data 要写入日志的数据
     * @return boolean
     */
    public static function save ($filename, $data=null)
    {
		global $G;
        // 要定入日志文件的内容添加时间标志和分隔符
        $data = date('Y-m-d H:i:s')."\n".$data."\n".str_repeat('-', 50)."\n\n";
        $file = $G['path_data'].'log/'.$filename.date(',H').'.log';
        mkdirext(dirname($file));
        // 多次尝试文件是否可写,防止文件锁定写入失败
        for ($i=0; $i<5; $i++) {
            if (!file_exists($file)) {
                $fp = @fopen($file, 'ab+');
            }
            // 文件体积大于10M,重新建立新文件,以"分"扩展到原文件名中(不含扩展名)
            elseif ( filesize($file) > 10000000000 ) {
                $filepart = explode('.', $file);
                $file = $filepart[0].date('_i').$filepart[1];
            }
            if (is_writable($file)) {
                if (empty($fp)) {
                    $fp = @fopen($file, 'ab+');
                }
                @flock($fp, LOCK_EX); // 文件是我的,谁也不许动
                @fwrite($fp, $data); // 记录写入文件
                @flock($fp, LOCK_UN); // 用完了,谁爱用谁用去
                @fclose($fp);
                break;// 可正常写文件就跳出循环尝试
            }
            if ($i == 4) { // 试了这么多次还不能正常写入? 开辟绿色通道.
                $filename = basename($file);
                $file = $dirname.'/'.date('Y-m-d.H-i-s').'-_-'.$filename;
                if (@$fp=@fopen($file, 'ab+')) {
                    @fwrite($fp, $data); // 记录写入文件
                    @fclose($fp);
                }
            }
            usleep(300);//本次不能写,可能被锁定,延时一会儿再尝试
        }
        return true;
    }

}